home *** CD-ROM | disk | FTP | other *** search
/ PCMania 73 / PCMania CD73_1.iso / pcmania / projue73 / Msoft / 073WIN95.c next >
C/C++ Source or Header  |  1998-09-27  |  6KB  |  260 lines

  1. /****************************************************\
  2. *   073WIN95.C                                       *
  3. *   Archivo con las funciones obligatorias              *
  4. *   GDI - LAS REGIONES                               *
  5. *   I±aki Otero. Villanueva de la Ca±ada, 1998.      *
  6. \****************************************************/
  7.  
  8. #define STRICT
  9. #include "073WIN95.H"
  10.  
  11. /*-------------------------- HANDLES Y VARIABLES ---*/
  12.  
  13. char Aplicacion[] = "REGIONES" ;
  14.  
  15. // Para almacenar las dimensiones
  16. // del ßrea cliente de nuestra ventana
  17. int areaclix, areacliy ;
  18.  
  19. /*--------------- FUNCION PRINCIPAL DEL PROGRAMA ---*/
  20.  
  21. int WINAPI WinMain(HINSTANCE hInstance,
  22.                          HINSTANCE hPrevInstance,
  23.                          LPSTR lpCmdLine,
  24.                    int nCmdShow)
  25. {
  26.     MSG msg ;
  27.    HWND hwnd ;
  28.    WNDCLASSEX wcx ;
  29.  
  30.      wcx.cbSize= sizeof(WNDCLASSEX) ;
  31.     wcx.style = CS_HREDRAW | CS_VREDRAW ;
  32.     wcx.lpfnWndProc = WinProc ;
  33.     wcx.cbClsExtra = 0 ;
  34.    wcx.cbWndExtra = 0 ;
  35.     wcx.hInstance = hInstance ;
  36.     wcx.hIcon = LoadIcon(NULL, IDI_WINLOGO) ;
  37.     wcx.hCursor = LoadCursor(NULL, IDC_ARROW) ;
  38.    wcx.hbrBackground = (HBRUSH)
  39.                               GetStockObject(WHITE_BRUSH);
  40.    wcx.lpszMenuName  = Aplicacion ;
  41.     wcx.lpszClassName = Aplicacion ;
  42.    wcx.hIconSm = LoadIcon(NULL, IDI_WINLOGO) ;
  43.  
  44.    if(!RegisterClassEx(&wcx)) return (FALSE) ;
  45.  
  46.     hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
  47.                                Aplicacion, Aplicacion,
  48.                                 WS_OVERLAPPEDWINDOW,
  49.                         64, 64, 512, 352,
  50.                                 NULL, NULL, hInstance,     NULL);
  51.  
  52.     if(!hwnd) return (FALSE) ;
  53.  
  54.     ShowWindow(hwnd, nCmdShow) ;
  55.    UpdateWindow(hwnd) ;
  56.  
  57.    while (GetMessage(&msg, NULL, 0, 0))
  58.     {
  59.           TranslateMessage(&msg) ;
  60.       DispatchMessage(&msg) ;
  61.  
  62.     }
  63.    return (msg.wParam) ;
  64. }
  65.  
  66. /*--------- FUNCION DEL PROCEDIMIENTO DE VENTANA ---*/
  67.  
  68. long CALLBACK WinProc(HWND hwnd, UINT message,
  69.                              WPARAM wParam, LPARAM lParam)
  70. {
  71.      HMENU hmenu    ;
  72.    PAINTSTRUCT ps ;
  73.     int respuesta ;
  74.    static int opcion = IDM_RECTREGION ;
  75.  
  76.     switch(message)
  77.     {
  78.      case WM_COMMAND:
  79.  
  80.          hmenu = GetMenu (hwnd) ;
  81.  
  82.             switch(LOWORD(wParam))
  83.             {
  84.                 case IDM_RECTREGION:
  85.                 case IDM_ROUNDRECTREGION:
  86.  
  87.                     CheckMenuItem(hmenu,
  88.                                  opcion, MF_UNCHECKED) ;
  89.                 opcion = LOWORD(wParam) ;
  90.                CheckMenuItem(hmenu,
  91.                                  opcion, MF_CHECKED) ;
  92.                     InvalidateRect(hwnd, NULL, TRUE) ;
  93.  
  94.                return 0 ;
  95.  
  96.              case IDM_SALIR:
  97.  
  98.                     respuesta = MessageBoxEx(    hwnd,
  99.                             "┐Desea abandonar el programa?",
  100.                             "SALIR",
  101.                            MB_YESNO | MB_ICONQUESTION,
  102.                      LANG_ENGLISH ) ;
  103.  
  104.                     if(respuesta == IDYES)
  105.                {
  106.                       DestroyWindow(hwnd) ;
  107.                    }
  108.  
  109.                   break ;
  110.            }
  111.  
  112.          break ;
  113.  
  114.         // Dimensiones de la ventana
  115.         case WM_SIZE:
  116.  
  117.             // Tomamos las dimensiones del
  118.          // ßrea cliente de nuestra ventana
  119.             areaclix = LOWORD (lParam) ;
  120.          areacliy = HIWORD (lParam) ;
  121.  
  122.          return 0 ;
  123.  
  124.       case WM_PAINT:
  125.  
  126.           BeginPaint(hwnd, &ps) ;
  127.  
  128.          // Ejecutamos los ejemplos en fuci≤n de
  129.          // la opci≤n elegida en el men· de persiana.
  130.             switch(opcion)
  131.             {
  132.                 case IDM_RECTREGION:
  133.  
  134.                     RgnRect(hwnd) ;
  135.                  break ;
  136.  
  137.                 case IDM_ROUNDRECTREGION:
  138.  
  139.                     RgnRoundRect(hwnd) ;
  140.                  break ;
  141.  
  142.          }
  143.  
  144.             EndPaint(hwnd, &ps) ;
  145.  
  146.          break ;
  147.  
  148.       case WM_DESTROY:
  149.  
  150.           PostQuitMessage(0) ;
  151.  
  152.          break ;
  153.  
  154.       default:
  155.  
  156.              return DefWindowProc(hwnd, message,
  157.                                      wParam, lParam) ;
  158.     }
  159.  
  160.    return 0 ;
  161. }
  162.  
  163. /*- FUNCIONES QUE PONEN LOS EJEMPLOS EN PANTALLA ---*/
  164.  
  165. // Ejemplo de CreateRectRgn, CreateRectRgnIndirect y
  166. //    FillRgn
  167. void RgnRect(HWND hwnd)
  168. {
  169.     HRGN hrgn1, hrgn2 ;
  170.    HDC hdc ;
  171.    COLORREF    rgb ;
  172.    HBRUSH hbrush ;
  173.     RECT rect1 ;
  174.    int ax, ay ;
  175.  
  176.     // dividimos el ßrea cliente por cinco
  177.     ax = areaclix / 5 ;
  178.    ay = areacliy / 5 ;
  179.  
  180.    // Estructura RECT
  181.    rect1.left     = ax * 3 ;
  182.     rect1.top    = ay  ;
  183.       rect1.right  = ax * 4 ;
  184.       rect1.bottom = ay * 4 ;
  185.  
  186.    // Creamos la brocha rayada
  187.     rgb       = RGB(255,   0,   0) ; // Rojo
  188.      hbrush = CreateHatchBrush(HS_BDIAGONAL, rgb) ;
  189.  
  190.    // Tomamos el contexto de dispositivo
  191.    hdc = GetDC(hwnd) ;
  192.  
  193.     // Regi≤n rectangular izquierda
  194.     hrgn1 = CreateRectRgn(ax, ay, ax * 2, ay * 4) ;
  195.  
  196.     // Regi≤n rectangular derecha
  197.     hrgn2 = CreateRectRgnIndirect(&rect1) ;
  198.  
  199.     // Pintamos las regiones con rayas diagonales
  200.    // cruzadas rojas
  201.     FillRgn(hdc, hrgn1, hbrush) ;
  202.     FillRgn(hdc, hrgn2, hbrush) ;
  203.  
  204.     // Eliminamos el contexto de dispositivo
  205.     ReleaseDC (hwnd, hdc) ;
  206.  
  207.     // Eliminamos los objetos GDI
  208.     DeleteObject(hbrush) ;
  209.     DeleteObject(hrgn1) ;
  210.     DeleteObject(hrgn2) ;
  211. }
  212.  
  213.  
  214. // Ejemplo de CreateRoundRectRgn, FillRgn e InvertRgn
  215. void RgnRoundRect(HWND hwnd)
  216. {
  217.     HRGN hrgn1, hrgn2 ;
  218.    HDC hdc ;
  219.    COLORREF    rgb ;
  220.    HBRUSH hbrush ;
  221.    int ax, ay ;
  222.  
  223.     // dividimos el ßrea cliente por cinco
  224.     ax = areaclix / 5 ;
  225.    ay = areacliy / 5 ;
  226.  
  227.    // Creamos la brocha rayada
  228.      rgb       = RGB(  0,   0, 255) ; // Azul
  229.      hbrush = CreateHatchBrush(HS_DIAGCROSS, rgb) ;
  230.  
  231.    // Tomamos el contexto de dispositivo
  232.    hdc = GetDC(hwnd) ;
  233.  
  234.     // Regi≤n rectangular redondeada izquierda
  235.     hrgn1 = CreateRoundRectRgn(ax, ay, ax * 2, ay * 4,
  236.                                                  ax / 3, ay / 3);
  237.  
  238.     // Regi≤n rectangular redondeada derecha
  239.     hrgn2 = CreateRoundRectRgn(ax * 3, ay, ax * 4,
  240.                                        ay * 4, ax / 3, ay / 3);
  241.  
  242.     // Pintamos ambas regiones
  243.    // con rayas diagonales verdes
  244.     FillRgn(hdc, hrgn1, hbrush) ;
  245.     FillRgn(hdc, hrgn2, hbrush) ;
  246.  
  247.     // Invertimos la region derecha
  248.     InvertRgn(hdc, hrgn2) ;
  249.  
  250.     // Eliminamos el contexto de dispositivo
  251.     ReleaseDC (hwnd, hdc) ;
  252.  
  253.     // Eliminamos los objetos GDI
  254.     DeleteObject(hbrush) ;
  255.     DeleteObject(hrgn1) ;
  256.     DeleteObject(hrgn2) ;
  257. }
  258.  
  259. /*------------------------------ FIN DEL ARCHIVO ---*/
  260.